#!/usr/bin/python3
# This new comment 1

import os
import subprocess
import sys

from py_ini_config_modules.common_functions import *
from py_ini_config_modules.nosection_functions import *
from py_ini_config_modules.system_functions import trim_empty_strings, write_config_to_file, get_comment_symbol

argv = sys.argv
separator = None
if '-s' in argv:
    key_index = argv.index('-s')
    if key_index != len(argv) - 1:
        separator = argv[key_index + 1]
        argv = argv[:key_index] + argv[key_index + 2:]
    else:
        argv = argv[:key_index] + argv[key_index + 1:]

noindent = False
if '--no-indent' in argv:
    noindent = True
    argv.remove('--no-indent')

com_symbol = '#'
if '--semicolon-comment' in argv:
    com_symbol = ';'
    argv.remove('--semicolon-comment')

view_comments = False
if '--view-comments' in argv:
    view_comments = True
    argv.remove('--view-comments')

argc = len(argv)
commands = (
    'comment',
    'del',
    'get',
    'is_set',
    'set',
    'uncomment',
    'del_section',
    'get_commented',
    'is_empty'
)
# Creating config file

if ('--create' in argv or '-c' in argv) and len(argv) >= 4 and os.path.isfile(argv[3]):
    print(f'Warning: file {argv[3]} exists. Flag --create will be ignored.')
    if '--create' in argv:
        argv.remove('--create')
    else:
        argv.remove('-c')
    argc -= 1

if '--create' in argv or '-c' in argv:
    if 'set' not in argv:
        eprint('Error - you must set a variable in the new config file')
        sys.exit(1)
    if '--create' in argv:
        indx = argv.index('--create')
    else:
        indx = argv.index('-c')
    if indx == len(argv) - 1:
        eprint('Error. You have not specified a file to create.')
        sys.exit(1)
    filename = argv[indx + 1]
    subprocess.run(f'touch {filename}', shell=True)
    argv = argv[:indx] + argv[indx + 2:]
    if len(argv) != 5:
        print('Для установления значения переменной в новом файле должно быть 6 или 7 параметров командной строки.')
        print('Синтаксис: py-ini-config set [-c, --create] filename [section, -n, --no-section]'
              ' var value [-s separator] [--no-indent]')
        sys.exit()
    if separator:
        if '-n' in argv or '--no-section' in argv:
            if '-n' in argv:
                argv.remove('-n')
            else:
                argv.remove('--no-section')
            config = ini_config_set_nosection(filename, argv[2], argv[3], noindent, com_symbol, view_comments, separator=separator)
        else:
            config = ini_config_set(filename, argv[2], argv[3], argv[4], noindent, com_symbol, view_comments, separator=separator)
    else:
        if '-n' in argv or '--no-section' in argv:
            if '-n' in argv:
                argv.remove('-n')
            else:
                argv.remove('--no-section')
            config = ini_config_set_nosection(filename, argv[2], argv[3], noindent, com_symbol, view_comments)
        else:
            config = ini_config_set(filename, argv[2], argv[3], argv[4], noindent, com_symbol, view_comments)
    write_config_to_file(config, filename)

# Working with config files with no sections

elif '-n' in argv or '--no-section' in argv:
    if '-n' in argv:
        argv.remove('-n')
    else:
        argv.remove('--no-section')
    if len(argv) < 3:
        eprint('Not enough commands.')
        sys.exit(1)
    elif argv[1] not in commands:
        eprint('Unknown command')
        sys.exit(1)
    elif not os.path.isfile(argv[2]):
        eprint('File not found')
        sys.exit(1)
    else:
        trim_empty_strings(argv[2])
        if com_symbol == '#':
            com_symbol = get_comment_symbol(argv[2])
        if argv[1] == 'set':
            if argc != 6:
                print('Для установления значения переменной в секции должно быть ровно 5 параметров командной строки.')
                print('Синтаксис: py-ini-config set file [-n, --no-section] var value [-s separator]')
                sys.exit()
            if separator:
                config = ini_config_set_nosection(argv[2], argv[3], argv[4], noindent, com_symbol, view_comments, separator=separator)
            else:
                config = ini_config_set_nosection(argv[2], argv[3], argv[4], noindent, com_symbol, view_comments)
            write_config_to_file(config, argv[2])

        elif argv[1] == 'comment':
            if argc != 5:
                print('Для установления значения переменной в секции должно быть ровно 4 параметра командной строки.')
                print('Синтаксис: py-ini-config comment file [-n, --no-section] var [-s separator]')
                sys.exit()
            else:
                if separator:
                    config = ini_config_comment_nosection(argv[2], argv[3], com_symbol, separator=separator)
                else:
                    config = ini_config_comment_nosection(argv[2], argv[3], com_symbol)
            if config is not False:
                write_config_to_file(config, argv[2])
            else:
                sys.exit(1)

        elif argv[1] == 'del':
            if argc != 5:
                print('Для установления значения переменной в секции должно быть ровно 4 параметра командной строки.')
                print('Синтаксис: py-ini-config del file [-n, --no-section] var [-s separator]')
                sys.exit()
            if separator:
                config = ini_config_del_nosection(argv[2], argv[3], com_symbol, separator=separator)
            else:
                config = ini_config_del_nosection(argv[2], argv[3], com_symbol)
            if config is not False:
                write_config_to_file(config, argv[2])
            else:
                sys.exit(1)

        elif argv[1] == 'get':
            if argc != 5:
                print('Для получения значения переменной в секции должно быть ровно 4 параметра командной строки.')
                print('Синтаксис: py-ini-config get file [-n, --no-section] var [-s separator]')
                sys.exit()
            if separator:
                res = ini_config_get_nosection(argv[2], argv[3], separator=separator)
            else:
                res = ini_config_get_nosection(argv[2], argv[3])
            if res:
                print(res)
            else:
                sys.exit(1)

        elif argv[1] == 'is_set':
            if argc != 5:
                print('Для получения значения переменной в секции должно быть ровно 4 параметра командной строки.')
                print('Синтаксис: py-ini-config is_set file [-n , --no-section] var [-s separator]')
                sys.exit()
            if separator:
                sys.exit(ini_config_is_set_nosection(argv[2], argv[3], separator=separator))
            else:
                sys.exit(ini_config_is_set_nosection(argv[2], argv[3]))

        elif argv[1] == 'uncomment':
            if argc != 5:
                print('Для установления значения переменной в секции должно быть ровно 4 параметра командной строки.')
                print('Синтаксис: py-ini-config uncomment file [-n , --no-section] var [-s separator]')
                sys.exit()
            else:
                if separator:
                    config = ini_config_uncomment_nosection(argv[2], argv[3], com_symbol, separator=separator)
                else:
                    config = ini_config_uncomment_nosection(argv[2], argv[3], com_symbol)
            if config is not False:
                write_config_to_file(config, argv[2])
            else:
                sys.exit(1)

        elif argv[1] == 'get_commented':
            if argc != 5:
                print('Для получения значения переменной в секции должно быть ровно 4 параметра командной строки.')
                print('Синтаксис: py-ini-config get_commented file [-n, --no-section] var [-s separator]')
                sys.exit()
            if separator:
                res = ini_config_get_commented_nosection(argv[2], argv[3], com_symbol, separator=separator)
            else:
                res = ini_config_get_commented_nosection(argv[2], argv[3], com_symbol)
            if res:
                print(*res, sep='\n')
            else:
                sys.exit(1)

elif len(argv) < 4:
    eprint('Not enough commands.')
    sys.exit(1)
elif argv[1] not in commands:
    eprint('Unknown command')
    sys.exit(1)
elif not os.path.isfile(argv[2]):
    eprint('File not found')
    sys.exit(1)
else:
    trim_empty_strings(argv[2])
    if com_symbol == '#':
        com_symbol = get_comment_symbol(argv[2])
    if argv[1] == 'set':
        if argc != 6:
            print('Для установления значения переменной в секции должно быть ровно 5 параметров командной строки.')
            print('Синтаксис: py-ini-config set file section var value [-s separator]')
            sys.exit()
        if separator:
            config = ini_config_set(argv[2], argv[3], argv[4], argv[5], noindent, com_symbol, view_comments, separator=separator)
        else:
            config = ini_config_set(argv[2], argv[3], argv[4], argv[5], noindent, com_symbol, view_comments)
        write_config_to_file(config, argv[2])

    elif argv[1] == 'comment':
        if argc not in (4, 5):
            print('Для установления значения переменной в секции должно быть 3 или 4 параметра командной строки.')
            print('Синтаксис: py-ini-config comment file section [var] [-s separator]')
            sys.exit()
        if argc == 5:
            if separator:
                config = ini_config_comment(argv[2], argv[3], com_symbol, argv[4], separator=separator)
            else:
                config = ini_config_comment(argv[2], argv[3], com_symbol, argv[4])
        else:
            if separator:
                config = ini_config_comment(argv[2], argv[3], com_symbol, separator=separator)
            else:
                config = ini_config_comment(argv[2], argv[3], com_symbol)
        if config is not False:
            write_config_to_file(config, argv[2])
        else:
            sys.exit(1)

    elif argv[1] == 'del':
        if argc not in (5, 6):
            print('Для установления значения переменной в секции должно быть 4 или 5 параметров командной строки.')
            print('Синтаксис: py-ini-config del file section var [-f, --flush] [-s separator]')
            sys.exit()
        flush = False
        if '-f' in argv:
            argv.remove('-f')
            flush = True
        elif '--flush' in argv:
            argv.remove('--flush')
            flush = True
        if separator:
            config = ini_config_del(argv[2], argv[3], argv[4], flush, com_symbol, separator=separator)
        else:
            config = ini_config_del(argv[2], argv[3], argv[4], flush, com_symbol)
        if config is not False:
            write_config_to_file(config, argv[2])
        else:
            sys.exit(1)

    elif argv[1] == 'get':
        if argc != 5:
            print('Для получения значения переменной в секции должно быть ровно 4 параметра командной строки.')
            print('Синтаксис: py-ini-config get file section var [-s separator]')
            sys.exit()
        if separator:
            res = ini_config_get(argv[2], argv[3], argv[4], separator=separator)
        else:
            res = ini_config_get(argv[2], argv[3], argv[4])
        if res:
            print(res)
        else:
            sys.exit(1)

    elif argv[1] == 'is_set':
        if argc not in (4, 5):
            print('Для получения значения переменной в секции должно быть 4 или 5 параметров командной строки.')
            print('Синтаксис: py-ini-config is_set file section [var] [-s separator]')
            sys.exit()
        if len(argv) == 4:
            argv.append(None)
        if separator:
            sys.exit(ini_config_is_set(argv[2], argv[3], argv[4], separator=separator))
        else:
            sys.exit(ini_config_is_set(argv[2], argv[3], argv[4]))

    elif argv[1] == 'uncomment':
        if argc not in (4, 5):
            print('Для установления значения переменной в секции должно быть 3 или 4 параметра командной строки.')
            print('Синтаксис: py-ini-config uncomment file section [var] [-s separator]')
            sys.exit()
        if argc == 5:
            if separator:
                config = ini_config_uncomment(argv[2], argv[3], com_symbol, argv[4], separator=separator)
            else:
                config = ini_config_uncomment(argv[2], argv[3], com_symbol, argv[4])
        else:
            if separator:
                config = ini_config_uncomment(argv[2], argv[3], com_symbol, separator=separator)
            else:
                config = ini_config_uncomment(argv[2], argv[3], com_symbol)
        if config is not False:
            write_config_to_file(config, argv[2])
        else:
            sys.exit(1)

    elif argv[1] == 'del_section':
        if argc != 4:
            print('Для установления значения переменной в секции должно быть ровно 3 параметра командной строки.')
            print('Синтаксис: py-ini-config del_section file section [-s separator]')
            sys.exit()
        if separator:
            config = ini_config_del_section(argv[2], argv[3], separator=separator)
        else:
            config = ini_config_del_section(argv[2], argv[3])
        if config is not False:
            write_config_to_file(config, argv[2])
        else:
            sys.exit(1)

    elif argv[1] == 'get_commented':
        if argc != 5:
            print('Для получения значения переменной в секции должно быть ровно 4 параметра командной строки.')
            print('Синтаксис: py-ini-config get_commented file section var [-s separator]')
            sys.exit()
        if separator:
            res = ini_config_get_commented(argv[2], argv[3], argv[4], com_symbol, separator=separator)
        else:
            res = ini_config_get_commented(argv[2], argv[3], argv[4], com_symbol)
        if res:
            print(*res, sep='\n')
        else:
            sys.exit(1)

    elif argv[1] == 'is_empty':
        if argc != 4:
            print('Для определения наличия переменных в секции должно быть ровно 3 параметра командной строки.')
            print('Синтаксис: py-ini-config is_empty file section [-s separator]')
            sys.exit()
        if separator:
            sys.exit(ini_config_is_empty(argv[2], argv[3], separator=separator))
        else:
            sys.exit(ini_config_is_empty(argv[2], argv[3]))
